Function.prototype.myCall = function (thisArg, ...args) {
  const _this =
    thisArg === null || thisArg === undefined || typeof thisArg === "function"
      ? window
      : thisArg;
  const key = Symbol("myCall");
  _this[key] = this;
  const result = _this[key](...args);
  delete _this[key];
  return result;
};

Function.prototype.myApply = function (thisArg, argsArray) {
  const key = Symbol("myApply");
  thisArg[key] = this;
  const result = thisArg[key](...argsArray);
  delete thisArg[key];
  return result;
};

Function.prototype.myBind = function (thisArg, ...args) {
  return (...args2) => {
    return this.call(thisArg, ...args, ...args2);
  };
};
/* 
  下面是完善之后的代码
*/
Function.prototype.myCall = function (thisArg, ...args) {
  // 处理函数调用的边界情况
  if (typeof this !== 'function') {
    throw new TypeError('Function.prototype.myCall called on incompatible object');
  }

  // 处理 thisArg 为 null 或 undefined 的情况，在严格模式下应为 undefined
  const isStrict = (function () { return this === undefined; })();
  const context = thisArg === null || thisArg === undefined
    ? (isStrict ? undefined : window)
    : Object(thisArg); // 将原始值转换为对象

  // 使用唯一 Symbol 避免属性冲突
  const fnSymbol = Symbol('myCall');
  context[fnSymbol] = this;

  // 执行函数并获取结果
  const result = context[fnSymbol](...args);

  // 删除临时属性并返回结果
  delete context[fnSymbol];
  return result;
};

Function.prototype.myApply = function (thisArg, argsArray) {
  // 处理函数调用的边界情况
  if (typeof this !== 'function') {
    throw new TypeError('Function.prototype.myApply called on incompatible object');
  }

  // 处理 argsArray 为 null 或 undefined 的情况
  if (argsArray === null || argsArray === undefined) {
    argsArray = [];
  }

  // 检查 argsArray 是否为类数组对象
  if (!Array.isArray(argsArray) && !(
    typeof argsArray === 'object' &&
    argsArray !== null &&
    'length' in argsArray &&
    typeof argsArray.length === 'number'
  )) {
    throw new TypeError('CreateListFromArrayLike called on non-object');
  }

  // 处理 thisArg 为 null 或 undefined 的情况，在严格模式下应为 undefined
  const isStrict = (function () { return this === undefined; })();
  const context = thisArg === null || thisArg === undefined
    ? (isStrict ? undefined : window)
    : Object(thisArg); // 将原始值转换为对象

  // 使用唯一 Symbol 避免属性冲突
  const fnSymbol = Symbol('myApply');
  context[fnSymbol] = this;

  // 执行函数并获取结果
  const result = context[fnSymbol](...argsArray);

  // 删除临时属性并返回结果
  delete context[fnSymbol];
  return result;
};

Function.prototype.myBind = function (thisArg, ...args) {
  // 处理函数调用的边界情况
  if (typeof this !== 'function') {
    throw new TypeError('Function.prototype.myBind called on incompatible object');
  }

  const self = this;
  const bound = function (...args2) {
    // 处理作为构造函数调用的情况
    if (this instanceof bound) {
      // 使用原始函数作为构造函数
      return self.apply(this, [...args, ...args2]);
    }

    // 正常调用，绑定 thisArg
    return self.apply(thisArg, [...args, ...args2]);
  };

  // 维护原型链
  bound.prototype = Object.create(self.prototype);

  return bound;
};